Introduction

The purpose of this tutorial will be to walk new users through some of the steps necessary to explore Whole Genome (WGS) and Whole Exome (WES) sequencing data generated form the 10x Genomics Chromium platform and the Longranger pipeline. We will investigate the Linked-Read data using a variety of tools, all of which are freely available either from 10x Genomics or

Things to know about this workshop

  1. All files that will be used can be found at: http://34.205.68.94/
  2. The 10x Loupe browser can be found at: http://34.205.68.94:3000/loupe/

User Instances

Username IP Terminal RStudio Download Files
testuser1 18.233.155.236 <a href='http://18.233.155.236:8888/terminals/1' target='_blank'>terminal</a> <a href='http://18.233.155.236:8787' target='_blank'>rstudio</a> <a href='http://18.233.155.236' target='_blank'>download files</a>
testuser2 54.236.82.65 <a href='http://54.236.82.65:8888/terminals/1' target='_blank'>terminal</a> <a href='http://54.236.82.65:8787' target='_blank'>rstudio</a> <a href='http://54.236.82.65' target='_blank'>download files</a>
testuser3 52.87.214.218 <a href='http://52.87.214.218:8888/terminals/1' target='_blank'>terminal</a> <a href='http://52.87.214.218:8787' target='_blank'>rstudio</a> <a href='http://52.87.214.218' target='_blank'>download files</a>
testuser4 52.90.195.255 <a href='http://52.90.195.255:8888/terminals/1' target='_blank'>terminal</a> <a href='http://52.90.195.255:8787' target='_blank'>rstudio</a> <a href='http://52.90.195.255' target='_blank'>download files</a>
testuser5 54.197.18.212 <a href='http://54.197.18.212:8888/terminals/1' target='_blank'>terminal</a> <a href='http://54.197.18.212:8787' target='_blank'>rstudio</a> <a href='http://54.197.18.212' target='_blank'>download files</a>

10x Chromium Workflow Overview

Exploring 10x Data

Exploring the 10x data via Integrated Geonome Browser (IGV) from the Broad Institute

IGV is one of the most common tools used in the field of genomeics to view a variety of different data types. If you do not have IGV, or don’t have the latest version (2.4), please download it from https://software.broadinstitute.org/software/igv/download

First open IGV and load the 10x data. There are two .bam files that can be explored. Here’s a snapshot of the 10x-bam-files directory

ubuntu@ip-172-31-63-156:~/10x-bam-files$ ls /home/ubuntu/10x-bam-files
total 1.3G
-rw-rw-r-- 1 ubuntu ubuntu  64M Apr  2 17:37 NA12878_chr21_phased_possorted_exome_bam.bam
-rw-rw-r-- 1 ubuntu ubuntu  83K Apr  2 17:37 NA12878_chr21_phased_possorted_exome_bam.bam.bai
-rw-rw-r-- 1 ubuntu ubuntu 1.2G Apr  2 17:41 NA12878_chr21_phased_possorted_WGS_bam.bam
-rw-rw-r-- 1 ubuntu ubuntu 116K Apr  2 17:37 NA12878_chr21_phased_possorted_WGS_bam.bam.bai
-rw-rw-r-- 1 ubuntu ubuntu  891 Apr  2 17:44 README.md

In order to load one of the .bam files follow the following steps.

  1. Navigate your browser to http://34.205.68.94/10x-bam-files/
  2. Copy the link address for one of the .bam files
  3. Open IGV
  4. Click File -> Load from URL
  5. Paste the coppied link address into the first box (you will not need to paste anything into the second box)
  6. Navigate to your favorite gene on chr21
    • Maybe CBS

Depending on what view you are in you might see reads paired in a variety of different ways. To show some of the special features of the 10x data:

  1. Right click on the cell to the left ending in “bam.bam”
  2. Select “View linked reads (BX)”

This will order the reads by barcode and, if possible, phase the region that you are investigating. Groups of reads will be “linked” to each other by the individual barcodes associated with the single molecule that the reads originated from. The reads and barcodes will also be seperated into phased haplotypes 1 (red) and 2 (blue). Those reads that could not be phased re represented by grey lines. These unphased reads are still useful and are utalized in most steps of Longranger.

Some things to keep in mind when thinking about 10x data

  1. Input material MATTERS
    • The old adage “Put junk in get junk out” applies here
    • Linked-Read data can be generated from shorter fragments and much of the enhance utility is retained but the longer DNA input length the better
  2. Not only will you have “read coverage” at any given locus you will also have physical, or barcode, coverage
    • This enables enhanced Structural Variant detection from what is otherwise short-read data
  3. Phasing is completely dependent on
    • SNV variation in the given region
    • Accessability to that region

Exploring the 10x data via the Loupe Browser by 10x Genomics

The Loupe Browser is a 10x specific genome browser that more fully captures some of the enhanced information that Linked-Reads will get you in your WGS or WES experiments. Loupe is fully integrated into the Longranger pipeline and .loupe files are automatically generated by defalut.

Our workshop has the Loupe browser setup at the address http://34.205.68.94:3000/loupe/

If you look at the 10x-loupe-files directory you can see three loupe files to explore.

ubuntu@ip-172-31-63-156:~/10x-loupe-files$ ls /home/ubuntu/10x-loupe-files
total 422M
-rw-rw-r-- 1 ubuntu ubuntu  40M Dec  8 09:02 LungTumorT.loupe
-rw-rw-r-- 1 ubuntu ubuntu 383M Apr 10 20:05 NA12878_exome.loupe

The Loupe main page

First let’s go to http://34.205.68.94:3000/loupe/ and click on NA12878_exome.loupe. This will bring us to the main page of Loupe which looks like this.

As you can see we have some nice statistics about the performace of our sequencing experiment including:

  • The number of genes phased
    • Fraction of genes (<100kb long) that are contained within a single phase block.
  • Phaseblock information
    • SNPs Phased
      • Percentage of heterozygous SNPs that were phased.
    • Longest Phase Block
      • Length of the longest phase block.
    • N50 Phase Block
      • Half of the genome was phased into phase blocks of at least this length.
  • Molecule length distrabution (we’ll work on recreating this)
  • GEM statistics

Haplotype View

Let’s navigate to chr17:41,074,530-41,399,282

There are a lot of “clickable” features to see here:

  • An annotation track
  • Coverage track in green
  • Exome bait targets (blue bars)
  • Variants
  • Phaseblocks (black)
    • Breaks in phasing do not have black box around them

Linked-Read View

Here you can see a similar output to that of IGV but it is a bit more digestable for viewing linked reads.

Once again, we can see reads clearly phased by haplotype and reads that do not get phased in grey.

  • In Lariat mode, Loupe colors reads based on their alignment properties:
    • Reads with a MAPQ less than 30 are colored grey
    • Reads with a high mapq that uniquely aligned are colored black
    • Reads with a high mapq that lariat was able to align because of their linkage to other reads are colored green.

Structural Variants View

If we open up the http://34.205.68.94:3000/loupe/load?file=NA12878_wgs.loupe file and navigate to chr2:34,595,838-34,795,838;chr2:34,636,560-34,836,560 we can very clearly see a hemizygous deletion in both the

Structural Variants View

and the

Linked-Read View


The 10x VCF

Special aspects

There are a few things that that make the 10x VCF unique. Overall 10x abides by the VCF 4.x standard. However, there is some additional information that takes advantage of the 10x specific technology. Documents covering the the 10x VCF spec can be found here

If we navigate to a 10x VCF and have a look

cd /home/ubuntu/10x-vcf-files
zcat NA12878_exome_varcalls.vcf.gz | less
#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  47669
chr1    10616   .       CCGCCGTTGCAAAGGCGCGCCG  C       54.7    PASS    AC=2;AF=1.0;AN=2;DP=7;ExcessHet=3.0103;FS=0.0;MLEAC=2;MLEAF=1.0;MQ=54.51;QD=27.35;SOR=2.303;POSTHPC=1;POSTHPB=G;MUMAP_REF=20.0;MUMAP_ALT=42.5;AO=6;RO=0;MMD=-1.0;RESCUED=0;NOT_RESCUED=9;POSTDNB=GC;POSTDNC=1;POSTTNB=GCC;POSTTNC=1;HAPLOCALLED=0       GT:AD:DP:GQ:PL:BX:PS    1|1:0,2:2:6:91,6,0:,CCGTACTGTTGTGTCA-1_43;CCATGTCGTTTAAGCC-1_43;GGACTTACAGATCGGA-1_43_43;ATCATGGGTAACTTCG-1_43;TCAGATGAGTGAGAAG-1_43:10616
chr1    11457   .       C       G       29.77   10X_ALLELE_FRACTION_FILTER      AC=1;AF=0.5;AN=2;BaseQRankSum=0.0;ClippingRankSum=0.0;DP=4;ExcessHet=3.0103;FS=0.0;MLEAC=1;MLEAF=0.5;MQ=37.59;MQRankSum=-1.383;QD=7.44;ReadPosRankSum=-0.674;SOR=0.693;MUMAP_REF=11.7273;MUMAP_ALT=30.0;AO=1;RO=2;MMD=3.5;RESCUED=1;NOT_RESCUED=12;HAPLOCALLED=0        GT:AD:DP:GQ:PL:BX:PS    0/1:2,2:4:58:58,0,150:AGTGGGAAGGTTAGTA-1_74;AAGTGGGCAAAGCAAT-1_74,TGTGGGCTCTAGAGTC-1_70:11457
chr1    11803   .       T       C       14.91   10X_QUAL_FILTER;10X_ALLELE_FRACTION_FILTER      AC=1;AF=0.5;AN=2;BaseQRankSum=-2.2;ClippingRankSum=0.0;DP=9;ExcessHet=3.0103;FS=0.0;MLEAC=1;MLEAF=0.5;MQ=44.77;MQRankSum=-2.2;QD=1.66;ReadPosRankSum=-1.383;SOR=0.223;MUMAP_REF=13.2368;MUMAP_ALT=3.57143;AO=0;RO=9;MMD=2.71429;RESCUED=0;NOT_RESCUED=45;HAPLOCALLED=0  GT:AD:DP:GQ:PL:BX:PS    0/1:7,2:9:43:43,0,334:GCTAGCGAGTTGAGAT-1_74_65;GCCAAATGTAGGTCGA-1_70;GAGTCCGTCCGCATCT-1_45;TGCATAGAGACTTCTG-1_74;CTGTTGCAGACCATAA-1_74;CTCAAAGGTCATGTAC-1_74;GAGATGGAGGTCAGAC-1_74_74,:11803
chr1    11863   .       C       A       59.77   PASS    AC=1;AF=0.5;AN=2;BaseQRankSum=-0.319;ClippingRankSum=0.0;DP=4;ExcessHet=3.0103;FS=0.0;MLEAC=1;MLEAF=0.5;MQ=50.02;MQRankSum=-1.15;QD=14.94;ReadPosRankSum=0.319;SOR=0.916;MUMAP_REF=9.3421;MUMAP_ALT=17.2222;AO=3;RO=6;MMD=1.34797;RESCUED=0;NOT_RESCUED=47;HAPLOCALLED=1        GT:AD:DP:GQ:PL:BX:PS:PQ:JQ      0|1:1,3:4:33:88,0,33:GCTAGCGAGTTGAGAT-1_70;ATCATGGCATCTATGG-1_45;TGCATAGAGACTTCTG-1_74;CTCAAAGGTCATGTAC-1_74;GAGATGGAGGTCAGAC-1_70,GACACATGTTGTGGCC-1_45;TTCGAAGCATCCTGGG-1_74;GCCAAATGTAGGTCGA-1_74:1:25:25
chr1    11921   .       T       C       12.05   10X_QUAL_FILTER;10X_ALLELE_FRACTION_FILTER      AC=1;AF=0.5;AN=2;BaseQRankSum=0.493;ClippingRankSum=0.0;DP=10;ExcessHet=3.0103;FS=3.31;MLEAC=1;MLEAF=0.5;MQ=48.28;MQRankSum=0.0;QD=1.2;ReadPosRankSum=-0.431;SOR=2.303;MUMAP_REF=11.1489;MUMAP_ALT=18.8;AO=1;RO=9;MMD=2.60317;RESCUED=0;NOT_RESCUED=52;HAPLOCALLED=0    GT:AD:DP:GQ:PL:BX:PS    0/1:8,2:10:40:40,0,311:GAGTCCGTCCGCATCT-1_74;CTACTTAGTGTGGCTC-1_74;ACGGAGATCCTTGGTC-1_74;TGCATAGAGACTTCTG-1_74;TTCGAAGCATCCTGGG-1_74;GAGATGGAGGTCAGAC-1_55;AGCTTCCGTTACGCCG-1_74;GACACATGTTGTGGCC-1_70,CGACTTCTCAACAGTC-1_74:11921

Not only do you see some of the typical things

  • chr, pos
  • REF, ALT
  • QUAL
  • FILTER
    • PASS
    • Reason for filtering

You can also see some of the extra 10x “stuff”. Mostly in the FORMAT field

  • BX
    • Barcodes of reads associated with an given variant
    • First set of ; seperated barcodes cover the first allele followed by a , which seperates barcodes associated with reads covering the second allele
  • PS
    • phase set
      • Information about the phase block for with the variant is assigned

This extra information can be very useful for looking at varints that may or may not be in cis or trans. This can be especially useful if you have compound heterozygote variants. All the alleles on one side of the seperator (|) with the same PS are from the same haplotype.

Note: For GT, | represents a phased variant \ represents an unphasd variant


The 10x .bam

General 10x .bam information

The 10x/Linked-Read .bam file contains much of the same information that a typical short read .bam would, but like the VCF has some extra information. Documents covering the the 10x .bam spec can be found here

If we take a look we can see some interesint features:

cd /home/ubuntu/10x-bam-files
samtools view -h NA12878_chr21_phased_possorted_exome_bam.bam | less
@PG     ID:lariat       PN:longranger.lariat    CL:lariat -reads=/mnt/analysis/marsoc/pipestances/HGKNJBBXX/PHASER_SVCALLER_EXOME_PD/49255/1016.1.1-0/PHASER_SVCALLER_EXOME_PD/PHASER_SVCALLER_EXOME/_LINKED_READS_ALIGNER/_FASTQ_PREP_NEW/SORT_FASTQS/fork0/join-u29c07c9de1/fi
les/chunk-0.fasth.gz -read_groups=49255:MissingLibrary:1:unknown_fc:0 -genome=/mnt/opt/refdata_new/hg19-2.0.0/fasta/genome.fa -sample_id=49255 -threads=4 -centromeres=/mnt/opt/refdata_new/hg19-2.0.0/regions/centromeres.tsv -trim_length=7 -first_chunk=True -output=/mnt/ana
lysis/marsoc/pipestances/HGKNJBBXX/PHASER_SVCALLER_EXOME_PD/49255/1016.1.1-0/PHASER_SVCALLER_EXOME_PD/PHASER_SVCALLER_EXOME/_LINKED_READS_ALIGNER/BARCODE_AWARE_ALIGNER/fork0/chnk000-u29c07c9e62/files VN:'576387f'
@PG     ID:attach_phasing       PN:longranger.attach_phasing    PP:lariat       VN:1016.1.1
@PG     ID:longranger   PN:longranger   PP:attach_phasing       VN:1016.1.1
@CO     10x_bam_to_fastq:R1(RX:QX,TR:TQ,SEQ:QUAL)
@CO     10x_bam_to_fastq:R2(SEQ:QUAL)
@CO     10x_bam_to_fastq:I1(BC:QT)
ST-K00126:334:HGKNJBBXX:4:2118:26920:14519      163     chr21   9412940 39      92M8S   =       9412953 90      GGAGTTGTATTGGTGCAGGAAGGGGAGTTTGATTTAATGAAACAATGCATTAAAAATTTGTATTCACTTTGTGATTCAATGATAGTCAATGTTAACATAA    AAA<FAJFFJJJJJJJJJJFJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
JJJJJJJJFAFF<FJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ    RX:Z:GACACATCAGCTGTTA   QX:Z:AAFFFJJJJJJJJJJJ   BC:Z:TCTCGGGC   QT:Z:AAFFFJJJ   XS:i:-13        AS:i:-9 XM:A:0  AM:A:0  XT:i:0  BX:Z:GACACATCAGCTGTTA-1 RG:Z:49255:MissingLibrary:1:unknown_fc:0        OM:i:39
ST-K00126:334:HGKNJBBXX:4:2118:26920:14519      83      chr21   9412953 39      77M     =       9412940 -90     TGCAGGAAGGGGAGTTTGATTTAATGAAACAATGCATTAAAAATTTGTATTCACTTTGTGATTCAATGATAGTCAAT   FJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJFJJJJJJ
RX:Z:GACACATCAGCTGTTA   QX:Z:AAFFFJJJJJJJJJJJ   TR:Z:TGTTAAC    TQ:Z:JJJJJJJ    BC:Z:TCTCGGGC   QT:Z:AAFFFJJJ   XS:i:-13        AS:i:-9 XM:A:0  AM:A:0  XT:i:0  BX:Z:GACACATCAGCTGTTA-1 RG:Z:49255:MissingLibrary:1:unknown_fc:0        OM:i:39
ST-K00126:334:HGKNJBBXX:4:1114:32644:45010      99      chr21   9413248 39      77M     =       9413263 115     TGAATATTTTCTCAGCAACTGTGGTGTTATGATATATATTGGTTTTCATCCCCAGTTCCTGGCTTATAACTCCCCTA   FF<J<FJJJ-J<JFAJFJJAJ-A-<7<A--FJ-AJJJFFFFJF-<FFF-F--7A<FF-<AF<JA-A-JJ-<<7FFF<
RX:Z:NAGGGTGAGGCATGGT   QX:Z:#<<AAFFJJFJJA<J<   TR:Z:TTCCGCA    TQ:Z:<FJJJFA    BC:Z:TCTCGGGC   QT:Z:AAAFFJJJ   XS:i:-12        AS:i:-8 XM:A:0  AM:A:0  XT:i:0  BX:Z:AAGGGTGAGGCATGGT-1 RG:Z:49255:MissingLibrary:1:unknown_fc:0        OM:i:39

Things to look for:

  • BX tag such as BX:Z:GACACATCAGCTGTTA-1
    • Barcode associated with a tag
  • Softclips (ask pat)

Informatics Tip: if you’d like to search for all the reads associated with a list of barcodes, this is the fastest way to do it (will need ripgrep)

samtools view -@ 5 possorted_exome_bam.bam | rg -j 5 --no-line-number -F -f BX_list.txt > BC_reads.sam

10x Genomics Software

All 10x specific software and information about 10x specific file formats can be found here


Jupitor Notebook

get into the LR env.

source /opt/longranger-2.2.2/sourceme.bash
LS0tCnRpdGxlOiAiMTB4IEdlbm9taWNzIEJpb2luZm9ybWF0aWMgV29ya3Nob3AgXG4gSmFja3NvbiBMYWJzIDIwMTgiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdGhlbWU6IHBhcGVyCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAzCiAgICB0b2NfZmxvYXQ6IHllcwogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMycKZGF0ZTogJ0NvbXBpbGVkOiBgciBmb3JtYXQoU3lzLkRhdGUoKSwgIiVCICVkLCAlWSIpYCcKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAogIGNhY2hlID0gRkFMU0UsCiAgY2FjaGUubGF6eSA9IEZBTFNFLAogIHRpZHkgPSBUUlVFCikKYGBgCgojICoqSW50cm9kdWN0aW9uKioKVGhlIHB1cnBvc2Ugb2YgdGhpcyB0dXRvcmlhbCB3aWxsIGJlIHRvIHdhbGsgbmV3IHVzZXJzIHRocm91Z2ggc29tZSBvZiB0aGUgc3RlcHMgbmVjZXNzYXJ5IHRvIGV4cGxvcmUgV2hvbGUgR2Vub21lIChXR1MpIGFuZCBXaG9sZSBFeG9tZSAoV0VTKSBzZXF1ZW5jaW5nIGRhdGEgZ2VuZXJhdGVkIGZvcm0gdGhlIDEweCBHZW5vbWljcyBDaHJvbWl1bSBwbGF0Zm9ybSBhbmQgdGhlIFtMb25ncmFuZ2VyIHBpcGVsaW5lXShodHRwczovL3N1cHBvcnQuMTB4Z2Vub21pY3MuY29tL2dlbm9tZS1leG9tZS9zb2Z0d2FyZS9waXBlbGluZXMvbGF0ZXN0L3doYXQtaXMtbG9uZy1yYW5nZXIpLiBXZSB3aWxsIGludmVzdGlnYXRlIHRoZSBMaW5rZWQtUmVhZCBkYXRhIHVzaW5nIGEgdmFyaWV0eSBvZiB0b29scywgYWxsIG9mIHdoaWNoIGFyZSBmcmVlbHkgYXZhaWxhYmxlIGVpdGhlciBmcm9tIFsxMHggR2Vub21pY3NdKGh0dHBzOi8vc3VwcG9ydC4xMHhnZW5vbWljcy5jb20vZ2Vub21lLWV4b21lL3NvZnR3YXJlL292ZXJ2aWV3L3dlbGNvbWUpIG9yICAKCioqVGhpbmdzIHRvIGtub3cgYWJvdXQgdGhpcyB3b3Jrc2hvcCoqCgoxLiBBbGwgZmlsZXMgdGhhdCB3aWxsIGJlIHVzZWQgY2FuIGJlIGZvdW5kIGF0OiBodHRwOi8vMzQuMjA1LjY4Ljk0LwoyLiBUaGUgMTB4IExvdXBlIGJyb3dzZXIgY2FuIGJlIGZvdW5kIGF0OiBodHRwOi8vMzQuMjA1LjY4Ljk0OjMwMDAvbG91cGUvCgoqKioKCiMgKioxMHggQ2hyb21pdW0gV29ya2Zsb3cgT3ZlcnZpZXcqKgoKIVtdKGh0dHA6Ly8zNC4yMDUuNjguOTQvZmlndXJlcy8xMHhfdGVjaC5wbmcpCgoKCiMgKipFeHBsb3JpbmcgMTB4IERhdGEqKgoKCiMjICoqRXhwbG9yaW5nIHRoZSAxMHggZGF0YSB2aWEgSW50ZWdyYXRlZCBHZW9ub21lIEJyb3dzZXIgKElHVikgZnJvbSB0aGUgQnJvYWQgSW5zdGl0dXRlKioKSUdWIGlzIG9uZSBvZiB0aGUgbW9zdCBjb21tb24gdG9vbHMgdXNlZCBpbiB0aGUgZmllbGQgb2YgZ2Vub21laWNzIHRvIHZpZXcgYSB2YXJpZXR5IG9mIGRpZmZlcmVudCBkYXRhIHR5cGVzLiBJZiB5b3UgZG8gbm90IGhhdmUgSUdWLCBvciBkb24ndCBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbiAoMi40KSwgcGxlYXNlIGRvd25sb2FkIGl0IGZyb20gaHR0cHM6Ly9zb2Z0d2FyZS5icm9hZGluc3RpdHV0ZS5vcmcvc29mdHdhcmUvaWd2L2Rvd25sb2FkCgpGaXJzdCBvcGVuIElHViBhbmQgbG9hZCB0aGUgMTB4IGRhdGEuIFRoZXJlIGFyZSB0d28gLmJhbSBmaWxlcyB0aGF0IGNhbiBiZSBleHBsb3JlZC4gSGVyZSdzIGEgc25hcHNob3Qgb2YgdGhlIGAxMHgtYmFtLWZpbGVzYCBkaXJlY3RvcnkKCmBgYAp1YnVudHVAaXAtMTcyLTMxLTYzLTE1Njp+LzEweC1iYW0tZmlsZXMkIGxzIC9ob21lL3VidW50dS8xMHgtYmFtLWZpbGVzCnRvdGFsIDEuM0cKLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDY0TSBBcHIgIDIgMTc6MzcgTkExMjg3OF9jaHIyMV9waGFzZWRfcG9zc29ydGVkX2V4b21lX2JhbS5iYW0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDgzSyBBcHIgIDIgMTc6MzcgTkExMjg3OF9jaHIyMV9waGFzZWRfcG9zc29ydGVkX2V4b21lX2JhbS5iYW0uYmFpCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDEuMkcgQXByICAyIDE3OjQxIE5BMTI4NzhfY2hyMjFfcGhhc2VkX3Bvc3NvcnRlZF9XR1NfYmFtLmJhbQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxMTZLIEFwciAgMiAxNzozNyBOQTEyODc4X2NocjIxX3BoYXNlZF9wb3Nzb3J0ZWRfV0dTX2JhbS5iYW0uYmFpCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICA4OTEgQXByICAyIDE3OjQ0IFJFQURNRS5tZApgYGAKCkluIG9yZGVyIHRvIGxvYWQgb25lIG9mIHRoZSAuYmFtIGZpbGVzIGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0ZXBzLgoKMS4gTmF2aWdhdGUgeW91ciBicm93c2VyIHRvIGh0dHA6Ly8zNC4yMDUuNjguOTQvMTB4LWJhbS1maWxlcy8KMi4gQ29weSB0aGUgbGluayBhZGRyZXNzIGZvciBvbmUgb2YgdGhlIC5iYW0gZmlsZXMKMy4gT3BlbiBJR1YKNC4gQ2xpY2sgRmlsZSAtPiBMb2FkIGZyb20gVVJMCjUuIFBhc3RlIHRoZSBjb3BwaWVkIGxpbmsgYWRkcmVzcyBpbnRvIHRoZSBmaXJzdCBib3ggKHlvdSB3aWxsIG5vdCBuZWVkIHRvIHBhc3RlIGFueXRoaW5nIGludG8gdGhlIHNlY29uZCBib3gpCjYuIE5hdmlnYXRlIHRvIHlvdXIgZmF2b3JpdGUgZ2VuZSBvbiBjaHIyMQogICAgKyBNYXliZSBfQ0JTXwoKRGVwZW5kaW5nIG9uIHdoYXQgdmlldyB5b3UgYXJlIGluIHlvdSBtaWdodCBzZWUgcmVhZHMgcGFpcmVkIGluIGEgdmFyaWV0eSBvZiBkaWZmZXJlbnQgd2F5cy4gVG8gc2hvdyBzb21lIG9mIHRoZSBzcGVjaWFsIGZlYXR1cmVzIG9mIHRoZSAxMHggZGF0YTogCgoxLiBSaWdodCBjbGljayBvbiB0aGUgY2VsbCB0byB0aGUgbGVmdCBlbmRpbmcgaW4gImJhbS5iYW0iCjIuIFNlbGVjdCAiVmlldyBsaW5rZWQgcmVhZHMgKEJYKSIKClRoaXMgd2lsbCBvcmRlciB0aGUgcmVhZHMgYnkgYmFyY29kZSBhbmQsIGlmIHBvc3NpYmxlLCBwaGFzZSB0aGUgcmVnaW9uIHRoYXQgeW91IGFyZSBpbnZlc3RpZ2F0aW5nLiBHcm91cHMgb2YgcmVhZHMgd2lsbCBiZSAibGlua2VkIiB0byBlYWNoIG90aGVyIGJ5IHRoZSBpbmRpdmlkdWFsIGJhcmNvZGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2luZ2xlIG1vbGVjdWxlIHRoYXQgdGhlIHJlYWRzIG9yaWdpbmF0ZWQgZnJvbS4gVGhlIHJlYWRzIGFuZCBiYXJjb2RlcyB3aWxsIGFsc28gYmUgc2VwZXJhdGVkIGludG8gcGhhc2VkIGhhcGxvdHlwZXMgMSAocmVkKSBhbmQgMiAoYmx1ZSkuIFRob3NlIHJlYWRzIHRoYXQgY291bGQgbm90IGJlIHBoYXNlZCByZSByZXByZXNlbnRlZCBieSBncmV5IGxpbmVzLiBUaGVzZSB1bnBoYXNlZCByZWFkcyBhcmUgc3RpbGwgdXNlZnVsIGFuZCBhcmUgdXRhbGl6ZWQgaW4gbW9zdCBzdGVwcyBvZiBMb25ncmFuZ2VyLgoKU29tZSB0aGluZ3MgdG8ga2VlcCBpbiBtaW5kIHdoZW4gdGhpbmtpbmcgYWJvdXQgMTB4IGRhdGEKCjEuIElucHV0IG1hdGVyaWFsICoqTUFUVEVSUyoqCiAgICArIFRoZSBvbGQgYWRhZ2UgIlB1dCBqdW5rIGluIGdldCBqdW5rIG91dCIgYXBwbGllcyBoZXJlCiAgICArIExpbmtlZC1SZWFkIGRhdGEgY2FuIGJlIGdlbmVyYXRlZCBmcm9tIHNob3J0ZXIgZnJhZ21lbnRzIGFuZCBtdWNoIG9mIHRoZSBlbmhhbmNlIHV0aWxpdHkgaXMgcmV0YWluZWQgYnV0IHRoZSBsb25nZXIgRE5BIGlucHV0IGxlbmd0aCB0aGUgYmV0dGVyCjIuIE5vdCBvbmx5IHdpbGwgeW91IGhhdmUgInJlYWQgY292ZXJhZ2UiIGF0IGFueSBnaXZlbiBsb2N1cyB5b3Ugd2lsbCBhbHNvIGhhdmUgcGh5c2ljYWwsIG9yIGJhcmNvZGUsIGNvdmVyYWdlCiAgICArIFRoaXMgZW5hYmxlcyBlbmhhbmNlZCBTdHJ1Y3R1cmFsIFZhcmlhbnQgZGV0ZWN0aW9uIGZyb20gd2hhdCBpcyBvdGhlcndpc2Ugc2hvcnQtcmVhZCBkYXRhCjMuIFBoYXNpbmcgaXMgY29tcGxldGVseSBkZXBlbmRlbnQgb24KICAgICsgU05WIHZhcmlhdGlvbiBpbiB0aGUgZ2l2ZW4gcmVnaW9uCiAgICArIEFjY2Vzc2FiaWxpdHkgdG8gdGhhdCByZWdpb24KICAgIAoqKioKCiMjICoqRXhwbG9yaW5nIHRoZSAxMHggZGF0YSB2aWEgdGhlIExvdXBlIEJyb3dzZXIgYnkgMTB4IEdlbm9taWNzKioKClRoZSBMb3VwZSBCcm93c2VyIGlzIGEgMTB4IHNwZWNpZmljIGdlbm9tZSBicm93c2VyIHRoYXQgbW9yZSBmdWxseSBjYXB0dXJlcyBzb21lIG9mIHRoZSBlbmhhbmNlZCBpbmZvcm1hdGlvbiB0aGF0IExpbmtlZC1SZWFkcyB3aWxsIGdldCB5b3UgaW4geW91ciBXR1Mgb3IgV0VTIGV4cGVyaW1lbnRzLiBbTG91cGVdKGh0dHBzOi8vc3VwcG9ydC4xMHhnZW5vbWljcy5jb20vZ2Vub21lLWV4b21lL3NvZnR3YXJlL3Zpc3VhbGl6YXRpb24vbGF0ZXN0L3doYXQtaXMtbG91cGUpIGlzIGZ1bGx5IGludGVncmF0ZWQgaW50byB0aGUgTG9uZ3JhbmdlciBwaXBlbGluZSBhbmQgLmxvdXBlIGZpbGVzIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBkZWZhbHV0LiAKCk91ciB3b3Jrc2hvcCBoYXMgdGhlIExvdXBlIGJyb3dzZXIgc2V0dXAgYXQgdGhlIGFkZHJlc3MgaHR0cDovLzM0LjIwNS42OC45NDozMDAwL2xvdXBlLwoKSWYgeW91IGxvb2sgYXQgdGhlIGAxMHgtbG91cGUtZmlsZXNgIGRpcmVjdG9yeSB5b3UgY2FuIHNlZSB0aHJlZSBsb3VwZSBmaWxlcyB0byBleHBsb3JlLiAKCmBgYAp1YnVudHVAaXAtMTcyLTMxLTYzLTE1Njp+LzEweC1sb3VwZS1maWxlcyQgbHMgL2hvbWUvdWJ1bnR1LzEweC1sb3VwZS1maWxlcwp0b3RhbCA0MjJNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICA0ME0gRGVjICA4IDA5OjAyIEx1bmdUdW1vclQubG91cGUKLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMzgzTSBBcHIgMTAgMjA6MDUgTkExMjg3OF9leG9tZS5sb3VwZQpgYGAKCiMjIyBUaGUgTG91cGUgbWFpbiBwYWdlCgpGaXJzdCBsZXQncyBnbyB0byBodHRwOi8vMzQuMjA1LjY4Ljk0OjMwMDAvbG91cGUvIGFuZCBjbGljayBvbiBgTkExMjg3OF9leG9tZS5sb3VwZWAuIFRoaXMgd2lsbCBicmluZyB1cyB0byB0aGUgbWFpbiBwYWdlIG9mIExvdXBlIHdoaWNoIGxvb2tzIGxpa2UgdGhpcy4gCgohW10oaHR0cDovLzM0LjIwNS42OC45NC9maWd1cmVzL0xvdXBlX2Zyb250cGFnZS5wbmcpCgpBcyB5b3UgY2FuIHNlZSB3ZSBoYXZlIHNvbWUgbmljZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBwZXJmb3JtYWNlIG9mIG91ciBzZXF1ZW5jaW5nIGV4cGVyaW1lbnQgaW5jbHVkaW5nOgoKKiBUaGUgbnVtYmVyIG9mIGdlbmVzIHBoYXNlZAogICAgKyBGcmFjdGlvbiBvZiBnZW5lcyAoPDEwMGtiIGxvbmcpIHRoYXQgYXJlIGNvbnRhaW5lZCB3aXRoaW4gYSBzaW5nbGUgcGhhc2UgYmxvY2suCiogUGhhc2VibG9jayBpbmZvcm1hdGlvbgogICAgKyBTTlBzIFBoYXNlZAogICAgICAgICsgUGVyY2VudGFnZSBvZiBoZXRlcm96eWdvdXMgU05QcyB0aGF0IHdlcmUgcGhhc2VkLgogICAgKyBMb25nZXN0IFBoYXNlIEJsb2NrCiAgICAgICAgKyBMZW5ndGggb2YgdGhlIGxvbmdlc3QgcGhhc2UgYmxvY2suCiAgICArIE41MCBQaGFzZSBCbG9jawogICAgICAgICsgSGFsZiBvZiB0aGUgZ2Vub21lIHdhcyBwaGFzZWQgaW50byBwaGFzZSBibG9ja3Mgb2YgYXQgbGVhc3QgdGhpcyBsZW5ndGguCiogTW9sZWN1bGUgbGVuZ3RoIGRpc3RyYWJ1dGlvbiAod2UnbGwgd29yayBvbiByZWNyZWF0aW5nIHRoaXMpCiogR0VNIHN0YXRpc3RpY3MKCgojIyMgSGFwbG90eXBlIFZpZXcKCkxldCdzIG5hdmlnYXRlIHRvIGBjaHIxNzo0MSwwNzQsNTMwLTQxLDM5OSwyODJgCgohW10oaHR0cDovLzM0LjIwNS42OC45NC9maWd1cmVzL05BMTI4NzhfaGFwbG90eXBlcy5wbmcpCgpUaGVyZSBhcmUgYSBsb3Qgb2YgImNsaWNrYWJsZSIgZmVhdHVyZXMgdG8gc2VlIGhlcmU6CgoqIEFuIGFubm90YXRpb24gdHJhY2sKKiBDb3ZlcmFnZSB0cmFjayBpbiBncmVlbgoqIEV4b21lIGJhaXQgdGFyZ2V0cyAoYmx1ZSBiYXJzKQoqIFZhcmlhbnRzCgohW10oaHR0cDovLzM0LjIwNS42OC45NC9maWd1cmVzL2xlZ2VuZC5zdmcpCgoqIFBoYXNlYmxvY2tzIChibGFjaykKICAgICsgQnJlYWtzIGluIHBoYXNpbmcgZG8gbm90IGhhdmUgYmxhY2sgYm94IGFyb3VuZCB0aGVtCgojIyMgTGlua2VkLVJlYWQgVmlldwoKSGVyZSB5b3UgY2FuIHNlZSBhIHNpbWlsYXIgb3V0cHV0IHRvIHRoYXQgb2YgSUdWIGJ1dCBpdCBpcyBhIGJpdCBtb3JlIGRpZ2VzdGFibGUgZm9yIHZpZXdpbmcgbGlua2VkIHJlYWRzLiAKCiFbXShodHRwOi8vMzQuMjA1LjY4Ljk0L2ZpZ3VyZXMvbG91cGUtbGlua2VkLXJlYWRzLnBuZykKCk9uY2UgYWdhaW4sIHdlIGNhbiBzZWUgcmVhZHMgY2xlYXJseSBwaGFzZWQgYnkgaGFwbG90eXBlIGFuZCByZWFkcyB0aGF0IGRvIG5vdCBnZXQgcGhhc2VkIGluIGdyZXkuCgoqIEluIExhcmlhdCBtb2RlLCBMb3VwZSBjb2xvcnMgcmVhZHMgYmFzZWQgb24gdGhlaXIgYWxpZ25tZW50IHByb3BlcnRpZXM6CiAgICArIFJlYWRzIHdpdGggYSBNQVBRIGxlc3MgdGhhbiAzMCBhcmUgY29sb3JlZCBncmV5CiAgICArIFJlYWRzIHdpdGggYSBoaWdoIG1hcHEgdGhhdCB1bmlxdWVseSBhbGlnbmVkIGFyZSBjb2xvcmVkIGJsYWNrCiAgICArIFJlYWRzIHdpdGggYSBoaWdoIG1hcHEgdGhhdCBsYXJpYXQgd2FzIGFibGUgdG8gYWxpZ24gYmVjYXVzZSBvZiB0aGVpciBsaW5rYWdlIHRvIG90aGVyIHJlYWRzIGFyZSBjb2xvcmVkIGdyZWVuLgoKCiMjIyBTdHJ1Y3R1cmFsIFZhcmlhbnRzIFZpZXcKCklmIHdlIG9wZW4gdXAgdGhlIGh0dHA6Ly8zNC4yMDUuNjguOTQ6MzAwMC9sb3VwZS9sb2FkP2ZpbGU9TkExMjg3OF93Z3MubG91cGUgZmlsZSBhbmQgbmF2aWdhdGUgdG8gYGNocjI6MzQsNTk1LDgzOC0zNCw3OTUsODM4O2NocjI6MzQsNjM2LDU2MC0zNCw4MzYsNTYwYCB3ZSBjYW4gdmVyeSBjbGVhcmx5IHNlZSBhIGhlbWl6eWdvdXMgZGVsZXRpb24gaW4gYm90aCB0aGUgCgoKCiMjIyMgKipTdHJ1Y3R1cmFsIFZhcmlhbnRzIFZpZXcqKgohW10oaHR0cDovLzM0LjIwNS42OC45NC9maWd1cmVzL2xvdXBlLXN2LWRlbC5wbmcpCiFbXShodHRwOi8vMzQuMjA1LjY4Ljk0L2ZpZ3VyZXMvbG91cGUtc3YtYmFyY29kZS1tYXRyaXgucG5nKQoKYW5kIHRoZQoKIyMjIyAqKkxpbmtlZC1SZWFkIFZpZXcqKgoKIVtdKGh0dHA6Ly8zNC4yMDUuNjguOTQvZmlndXJlcy9sb3VwZS1saW5rZWQtcmVhZHMtZGVsLnBuZykKCioqKgoKIyAqKlRoZSAxMHggVkNGKioKCiMjIFNwZWNpYWwgYXNwZWN0cwoKVGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB0aGF0IHRoYXQgbWFrZSB0aGUgMTB4IFZDRiB1bmlxdWUuIE92ZXJhbGwgMTB4IGFiaWRlcyBieSB0aGUgVkNGIDQueCBzdGFuZGFyZC4gSG93ZXZlciwgdGhlcmUgaXMgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoYXQgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSAxMHggc3BlY2lmaWMgdGVjaG5vbG9neS4gRG9jdW1lbnRzIGNvdmVyaW5nIHRoZSB0aGUgMTB4IFZDRiBzcGVjIGNhbiBiZSBmb3VuZCBbaGVyZV0oaHR0cHM6Ly9zdXBwb3J0LjEweGdlbm9taWNzLmNvbS9nZW5vbWUtZXhvbWUvc29mdHdhcmUvcGlwZWxpbmVzL2xhdGVzdC9vdXRwdXQvdmNmKSAKCklmIHdlIG5hdmlnYXRlIHRvIGEgMTB4IFZDRiBhbmQgaGF2ZSBhIGxvb2sgCgpgYGAKY2QgL2hvbWUvdWJ1bnR1LzEweC12Y2YtZmlsZXMKemNhdCBOQTEyODc4X2V4b21lX3ZhcmNhbGxzLnZjZi5neiB8IGxlc3MKYGBgCmBgYAojQ0hST00gIFBPUyAgICAgSUQgICAgICBSRUYgICAgIEFMVCAgICAgUVVBTCAgICBGSUxURVIgIElORk8gICAgRk9STUFUICA0NzY2OQpjaHIxICAgIDEwNjE2ICAgLiAgICAgICBDQ0dDQ0dUVEdDQUFBR0dDR0NHQ0NHICBDICAgICAgIDU0LjcgICAgUEFTUyAgICBBQz0yO0FGPTEuMDtBTj0yO0RQPTc7RXhjZXNzSGV0PTMuMDEwMztGUz0wLjA7TUxFQUM9MjtNTEVBRj0xLjA7TVE9NTQuNTE7UUQ9MjcuMzU7U09SPTIuMzAzO1BPU1RIUEM9MTtQT1NUSFBCPUc7TVVNQVBfUkVGPTIwLjA7TVVNQVBfQUxUPTQyLjU7QU89NjtSTz0wO01NRD0tMS4wO1JFU0NVRUQ9MDtOT1RfUkVTQ1VFRD05O1BPU1RETkI9R0M7UE9TVEROQz0xO1BPU1RUTkI9R0NDO1BPU1RUTkM9MTtIQVBMT0NBTExFRD0wICAgICAgIEdUOkFEOkRQOkdROlBMOkJYOlBTICAgIDF8MTowLDI6Mjo2OjkxLDYsMDosQ0NHVEFDVEdUVEdUR1RDQS0xXzQzO0NDQVRHVENHVFRUQUFHQ0MtMV80MztHR0FDVFRBQ0FHQVRDR0dBLTFfNDNfNDM7QVRDQVRHR0dUQUFDVFRDRy0xXzQzO1RDQUdBVEdBR1RHQUdBQUctMV80MzoxMDYxNgpjaHIxICAgIDExNDU3ICAgLiAgICAgICBDICAgICAgIEcgICAgICAgMjkuNzcgICAxMFhfQUxMRUxFX0ZSQUNUSU9OX0ZJTFRFUiAgICAgIEFDPTE7QUY9MC41O0FOPTI7QmFzZVFSYW5rU3VtPTAuMDtDbGlwcGluZ1JhbmtTdW09MC4wO0RQPTQ7RXhjZXNzSGV0PTMuMDEwMztGUz0wLjA7TUxFQUM9MTtNTEVBRj0wLjU7TVE9MzcuNTk7TVFSYW5rU3VtPS0xLjM4MztRRD03LjQ0O1JlYWRQb3NSYW5rU3VtPS0wLjY3NDtTT1I9MC42OTM7TVVNQVBfUkVGPTExLjcyNzM7TVVNQVBfQUxUPTMwLjA7QU89MTtSTz0yO01NRD0zLjU7UkVTQ1VFRD0xO05PVF9SRVNDVUVEPTEyO0hBUExPQ0FMTEVEPTAgICAgICAgIEdUOkFEOkRQOkdROlBMOkJYOlBTICAgIDAvMToyLDI6NDo1ODo1OCwwLDE1MDpBR1RHR0dBQUdHVFRBR1RBLTFfNzQ7QUFHVEdHR0NBQUFHQ0FBVC0xXzc0LFRHVEdHR0NUQ1RBR0FHVEMtMV83MDoxMTQ1NwpjaHIxICAgIDExODAzICAgLiAgICAgICBUICAgICAgIEMgICAgICAgMTQuOTEgICAxMFhfUVVBTF9GSUxURVI7MTBYX0FMTEVMRV9GUkFDVElPTl9GSUxURVIgICAgICBBQz0xO0FGPTAuNTtBTj0yO0Jhc2VRUmFua1N1bT0tMi4yO0NsaXBwaW5nUmFua1N1bT0wLjA7RFA9OTtFeGNlc3NIZXQ9My4wMTAzO0ZTPTAuMDtNTEVBQz0xO01MRUFGPTAuNTtNUT00NC43NztNUVJhbmtTdW09LTIuMjtRRD0xLjY2O1JlYWRQb3NSYW5rU3VtPS0xLjM4MztTT1I9MC4yMjM7TVVNQVBfUkVGPTEzLjIzNjg7TVVNQVBfQUxUPTMuNTcxNDM7QU89MDtSTz05O01NRD0yLjcxNDI5O1JFU0NVRUQ9MDtOT1RfUkVTQ1VFRD00NTtIQVBMT0NBTExFRD0wICBHVDpBRDpEUDpHUTpQTDpCWDpQUyAgICAwLzE6NywyOjk6NDM6NDMsMCwzMzQ6R0NUQUdDR0FHVFRHQUdBVC0xXzc0XzY1O0dDQ0FBQVRHVEFHR1RDR0EtMV83MDtHQUdUQ0NHVENDR0NBVENULTFfNDU7VEdDQVRBR0FHQUNUVENURy0xXzc0O0NUR1RUR0NBR0FDQ0FUQUEtMV83NDtDVENBQUFHR1RDQVRHVEFDLTFfNzQ7R0FHQVRHR0FHR1RDQUdBQy0xXzc0Xzc0LDoxMTgwMwpjaHIxICAgIDExODYzICAgLiAgICAgICBDICAgICAgIEEgICAgICAgNTkuNzcgICBQQVNTICAgIEFDPTE7QUY9MC41O0FOPTI7QmFzZVFSYW5rU3VtPS0wLjMxOTtDbGlwcGluZ1JhbmtTdW09MC4wO0RQPTQ7RXhjZXNzSGV0PTMuMDEwMztGUz0wLjA7TUxFQUM9MTtNTEVBRj0wLjU7TVE9NTAuMDI7TVFSYW5rU3VtPS0xLjE1O1FEPTE0Ljk0O1JlYWRQb3NSYW5rU3VtPTAuMzE5O1NPUj0wLjkxNjtNVU1BUF9SRUY9OS4zNDIxO01VTUFQX0FMVD0xNy4yMjIyO0FPPTM7Uk89NjtNTUQ9MS4zNDc5NztSRVNDVUVEPTA7Tk9UX1JFU0NVRUQ9NDc7SEFQTE9DQUxMRUQ9MSAgICAgICAgR1Q6QUQ6RFA6R1E6UEw6Qlg6UFM6UFE6SlEgICAgICAwfDE6MSwzOjQ6MzM6ODgsMCwzMzpHQ1RBR0NHQUdUVEdBR0FULTFfNzA7QVRDQVRHR0NBVENUQVRHRy0xXzQ1O1RHQ0FUQUdBR0FDVFRDVEctMV83NDtDVENBQUFHR1RDQVRHVEFDLTFfNzQ7R0FHQVRHR0FHR1RDQUdBQy0xXzcwLEdBQ0FDQVRHVFRHVEdHQ0MtMV80NTtUVENHQUFHQ0FUQ0NUR0dHLTFfNzQ7R0NDQUFBVEdUQUdHVENHQS0xXzc0OjE6MjU6MjUKY2hyMSAgICAxMTkyMSAgIC4gICAgICAgVCAgICAgICBDICAgICAgIDEyLjA1ICAgMTBYX1FVQUxfRklMVEVSOzEwWF9BTExFTEVfRlJBQ1RJT05fRklMVEVSICAgICAgQUM9MTtBRj0wLjU7QU49MjtCYXNlUVJhbmtTdW09MC40OTM7Q2xpcHBpbmdSYW5rU3VtPTAuMDtEUD0xMDtFeGNlc3NIZXQ9My4wMTAzO0ZTPTMuMzE7TUxFQUM9MTtNTEVBRj0wLjU7TVE9NDguMjg7TVFSYW5rU3VtPTAuMDtRRD0xLjI7UmVhZFBvc1JhbmtTdW09LTAuNDMxO1NPUj0yLjMwMztNVU1BUF9SRUY9MTEuMTQ4OTtNVU1BUF9BTFQ9MTguODtBTz0xO1JPPTk7TU1EPTIuNjAzMTc7UkVTQ1VFRD0wO05PVF9SRVNDVUVEPTUyO0hBUExPQ0FMTEVEPTAgICAgR1Q6QUQ6RFA6R1E6UEw6Qlg6UFMgICAgMC8xOjgsMjoxMDo0MDo0MCwwLDMxMTpHQUdUQ0NHVENDR0NBVENULTFfNzQ7Q1RBQ1RUQUdUR1RHR0NUQy0xXzc0O0FDR0dBR0FUQ0NUVEdHVEMtMV83NDtUR0NBVEFHQUdBQ1RUQ1RHLTFfNzQ7VFRDR0FBR0NBVENDVEdHRy0xXzc0O0dBR0FUR0dBR0dUQ0FHQUMtMV81NTtBR0NUVENDR1RUQUNHQ0NHLTFfNzQ7R0FDQUNBVEdUVEdUR0dDQy0xXzcwLENHQUNUVENUQ0FBQ0FHVEMtMV83NDoxMTkyMQpgYGAKCioqTm90IG9ubHkgZG8geW91IHNlZSBzb21lIG9mIHRoZSB0eXBpY2FsIHRoaW5ncyoqCgoqIGNociwgcG9zCiogUkVGLCBBTFQKKiBRVUFMCiogRklMVEVSCiAgICArIFBBU1MKICAgICsgUmVhc29uIGZvciBmaWx0ZXJpbmcKICAgIAoqKllvdSBjYW4gYWxzbyBzZWUgc29tZSBvZiB0aGUgZXh0cmEgMTB4ICJzdHVmZiIuIE1vc3RseSBpbiB0aGUgRk9STUFUIGZpZWxkKioKCiogQlgKICAgICsgQmFyY29kZXMgb2YgcmVhZHMgYXNzb2NpYXRlZCB3aXRoIGFuIGdpdmVuIHZhcmlhbnQKICAgICsgRmlyc3Qgc2V0IG9mIGA7YCBzZXBlcmF0ZWQgYmFyY29kZXMgY292ZXIgdGhlIGZpcnN0IGFsbGVsZSBmb2xsb3dlZCBieSBhIGAsYCB3aGljaCBzZXBlcmF0ZXMgYmFyY29kZXMgYXNzb2NpYXRlZCB3aXRoIHJlYWRzIGNvdmVyaW5nIHRoZSBzZWNvbmQgYWxsZWxlCiogUFMKICAgICsgcGhhc2Ugc2V0CiAgICAgICAgKyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcGhhc2UgYmxvY2sgZm9yIHdpdGggdGhlIHZhcmlhbnQgaXMgYXNzaWduZWQgCgpUaGlzIGV4dHJhIGluZm9ybWF0aW9uIGNhbiBiZSB2ZXJ5IHVzZWZ1bCBmb3IgbG9va2luZyBhdCB2YXJpbnRzIHRoYXQgbWF5IG9yIG1heSBub3QgYmUgaW4gX2Npc18gb3IgX3RyYW5zXy4gVGhpcyBjYW4gYmUgZXNwZWNpYWxseSB1c2VmdWwgaWYgeW91IGhhdmUgY29tcG91bmQgaGV0ZXJvenlnb3RlIHZhcmlhbnRzLiBBbGwgdGhlIGFsbGVsZXMgb24gb25lIHNpZGUgb2YgdGhlIHNlcGVyYXRvciAoYHxgKSB3aXRoIHRoZSBzYW1lIGBQU2AgYXJlIGZyb20gdGhlIHNhbWUgaGFwbG90eXBlLiAKCl9Ob3RlXzogRm9yIEdULCBgfGAgcmVwcmVzZW50cyBhIHBoYXNlZCB2YXJpYW50IGBcYCByZXByZXNlbnRzIGFuIHVucGhhc2QgdmFyaWFudAoKKioqCiAgICAgICAgCiMgKipUaGUgMTB4IC5iYW0qKgoKIyMgR2VuZXJhbCAxMHggLmJhbSBpbmZvcm1hdGlvbgoKVGhlIDEweC9MaW5rZWQtUmVhZCAuYmFtIGZpbGUgY29udGFpbnMgbXVjaCBvZiB0aGUgc2FtZSBpbmZvcm1hdGlvbiB0aGF0IGEgdHlwaWNhbCBzaG9ydCByZWFkIC5iYW0gd291bGQsIGJ1dCBsaWtlIHRoZSBWQ0YgaGFzIHNvbWUgZXh0cmEgaW5mb3JtYXRpb24uIERvY3VtZW50cyBjb3ZlcmluZyB0aGUgdGhlIDEweCAuYmFtIHNwZWMgY2FuIGJlIGZvdW5kIFtoZXJlXShodHRwczovL3N1cHBvcnQuMTB4Z2Vub21pY3MuY29tL2dlbm9tZS1leG9tZS9zb2Z0d2FyZS9waXBlbGluZXMvbGF0ZXN0L291dHB1dC9iYW0pICAKCklmIHdlIHRha2UgYSBsb29rIHdlIGNhbiBzZWUgc29tZSBpbnRlcmVzaW50IGZlYXR1cmVzOiAKCmBgYApjZCAvaG9tZS91YnVudHUvMTB4LWJhbS1maWxlcwpzYW10b29scyB2aWV3IC1oIE5BMTI4NzhfY2hyMjFfcGhhc2VkX3Bvc3NvcnRlZF9leG9tZV9iYW0uYmFtIHwgbGVzcwpgYGAKYGBgCkBQRyAgICAgSUQ6bGFyaWF0ICAgICAgIFBOOmxvbmdyYW5nZXIubGFyaWF0ICAgIENMOmxhcmlhdCAtcmVhZHM9L21udC9hbmFseXNpcy9tYXJzb2MvcGlwZXN0YW5jZXMvSEdLTkpCQlhYL1BIQVNFUl9TVkNBTExFUl9FWE9NRV9QRC80OTI1NS8xMDE2LjEuMS0wL1BIQVNFUl9TVkNBTExFUl9FWE9NRV9QRC9QSEFTRVJfU1ZDQUxMRVJfRVhPTUUvX0xJTktFRF9SRUFEU19BTElHTkVSL19GQVNUUV9QUkVQX05FVy9TT1JUX0ZBU1RRUy9mb3JrMC9qb2luLXUyOWMwN2M5ZGUxL2ZpCmxlcy9jaHVuay0wLmZhc3RoLmd6IC1yZWFkX2dyb3Vwcz00OTI1NTpNaXNzaW5nTGlicmFyeToxOnVua25vd25fZmM6MCAtZ2Vub21lPS9tbnQvb3B0L3JlZmRhdGFfbmV3L2hnMTktMi4wLjAvZmFzdGEvZ2Vub21lLmZhIC1zYW1wbGVfaWQ9NDkyNTUgLXRocmVhZHM9NCAtY2VudHJvbWVyZXM9L21udC9vcHQvcmVmZGF0YV9uZXcvaGcxOS0yLjAuMC9yZWdpb25zL2NlbnRyb21lcmVzLnRzdiAtdHJpbV9sZW5ndGg9NyAtZmlyc3RfY2h1bms9VHJ1ZSAtb3V0cHV0PS9tbnQvYW5hCmx5c2lzL21hcnNvYy9waXBlc3RhbmNlcy9IR0tOSkJCWFgvUEhBU0VSX1NWQ0FMTEVSX0VYT01FX1BELzQ5MjU1LzEwMTYuMS4xLTAvUEhBU0VSX1NWQ0FMTEVSX0VYT01FX1BEL1BIQVNFUl9TVkNBTExFUl9FWE9NRS9fTElOS0VEX1JFQURTX0FMSUdORVIvQkFSQ09ERV9BV0FSRV9BTElHTkVSL2ZvcmswL2NobmswMDAtdTI5YzA3YzllNjIvZmlsZXMgVk46JzU3NjM4N2YnCkBQRyAgICAgSUQ6YXR0YWNoX3BoYXNpbmcgICAgICAgUE46bG9uZ3Jhbmdlci5hdHRhY2hfcGhhc2luZyAgICBQUDpsYXJpYXQgICAgICAgVk46MTAxNi4xLjEKQFBHICAgICBJRDpsb25ncmFuZ2VyICAgUE46bG9uZ3JhbmdlciAgIFBQOmF0dGFjaF9waGFzaW5nICAgICAgIFZOOjEwMTYuMS4xCkBDTyAgICAgMTB4X2JhbV90b19mYXN0cTpSMShSWDpRWCxUUjpUUSxTRVE6UVVBTCkKQENPICAgICAxMHhfYmFtX3RvX2Zhc3RxOlIyKFNFUTpRVUFMKQpAQ08gICAgIDEweF9iYW1fdG9fZmFzdHE6STEoQkM6UVQpClNULUswMDEyNjozMzQ6SEdLTkpCQlhYOjQ6MjExODoyNjkyMDoxNDUxOSAgICAgIDE2MyAgICAgY2hyMjEgICA5NDEyOTQwIDM5ICAgICAgOTJNOFMgICA9ICAgICAgIDk0MTI5NTMgOTAgICAgICBHR0FHVFRHVEFUVEdHVEdDQUdHQUFHR0dHQUdUVFRHQVRUVEFBVEdBQUFDQUFUR0NBVFRBQUFBQVRUVEdUQVRUQ0FDVFRUR1RHQVRUQ0FBVEdBVEFHVENBQVRHVFRBQUNBVEFBICAgIEFBQTxGQUpGRkpKSkpKSkpKSkpGSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKCkpKSkpKSkpKRkFGRjxGSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKICAgIFJYOlo6R0FDQUNBVENBR0NUR1RUQSAgIFFYOlo6QUFGRkZKSkpKSkpKSkpKSiAgIEJDOlo6VENUQ0dHR0MgICBRVDpaOkFBRkZGSkpKICAgWFM6aTotMTMgICAgICAgIEFTOmk6LTkgWE06QTowICBBTTpBOjAgIFhUOmk6MCAgQlg6WjpHQUNBQ0FUQ0FHQ1RHVFRBLTEgUkc6Wjo0OTI1NTpNaXNzaW5nTGlicmFyeToxOnVua25vd25fZmM6MCAgICAgICAgT006aTozOQpTVC1LMDAxMjY6MzM0OkhHS05KQkJYWDo0OjIxMTg6MjY5MjA6MTQ1MTkgICAgICA4MyAgICAgIGNocjIxICAgOTQxMjk1MyAzOSAgICAgIDc3TSAgICAgPSAgICAgICA5NDEyOTQwIC05MCAgICAgVEdDQUdHQUFHR0dHQUdUVFRHQVRUVEFBVEdBQUFDQUFUR0NBVFRBQUFBQVRUVEdUQVRUQ0FDVFRUR1RHQVRUQ0FBVEdBVEFHVENBQVQgICBGSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKRkpKSkpKSgpSWDpaOkdBQ0FDQVRDQUdDVEdUVEEgICBRWDpaOkFBRkZGSkpKSkpKSkpKSkogICBUUjpaOlRHVFRBQUMgICAgVFE6WjpKSkpKSkpKICAgIEJDOlo6VENUQ0dHR0MgICBRVDpaOkFBRkZGSkpKICAgWFM6aTotMTMgICAgICAgIEFTOmk6LTkgWE06QTowICBBTTpBOjAgIFhUOmk6MCAgQlg6WjpHQUNBQ0FUQ0FHQ1RHVFRBLTEgUkc6Wjo0OTI1NTpNaXNzaW5nTGlicmFyeToxOnVua25vd25fZmM6MCAgICAgICAgT006aTozOQpTVC1LMDAxMjY6MzM0OkhHS05KQkJYWDo0OjExMTQ6MzI2NDQ6NDUwMTAgICAgICA5OSAgICAgIGNocjIxICAgOTQxMzI0OCAzOSAgICAgIDc3TSAgICAgPSAgICAgICA5NDEzMjYzIDExNSAgICAgVEdBQVRBVFRUVENUQ0FHQ0FBQ1RHVEdHVEdUVEFUR0FUQVRBVEFUVEdHVFRUVENBVENDQ0NBR1RUQ0NUR0dDVFRBVEFBQ1RDQ0NDVEEgICBGRjxKPEZKSkotSjxKRkFKRkpKQUotQS08NzxBLS1GSi1BSkpKRkZGRkpGLTxGRkYtRi0tN0E8RkYtPEFGPEpBLUEtSkotPDw3RkZGPApSWDpaOk5BR0dHVEdBR0dDQVRHR1QgICBRWDpaOiM8PEFBRkZKSkZKSkE8SjwgICBUUjpaOlRUQ0NHQ0EgICAgVFE6Wjo8RkpKSkZBICAgIEJDOlo6VENUQ0dHR0MgICBRVDpaOkFBQUZGSkpKICAgWFM6aTotMTIgICAgICAgIEFTOmk6LTggWE06QTowICBBTTpBOjAgIFhUOmk6MCAgQlg6WjpBQUdHR1RHQUdHQ0FUR0dULTEgUkc6Wjo0OTI1NTpNaXNzaW5nTGlicmFyeToxOnVua25vd25fZmM6MCAgICAgICAgT006aTozOQpgYGAKClRoaW5ncyB0byBsb29rIGZvcjoKCiogQlggdGFnIHN1Y2ggYXMgYEJYOlo6R0FDQUNBVENBR0NUR1RUQS0xYAogICAgKyBCYXJjb2RlIGFzc29jaWF0ZWQgd2l0aCBhIHRhZwoqIFNvZnRjbGlwcyAoX2FzayBwYXRfKQoKCl9JbmZvcm1hdGljcyBUaXBfOiBpZiB5b3UnZCBsaWtlIHRvIHNlYXJjaCBmb3IgYWxsIHRoZSByZWFkcyBhc3NvY2lhdGVkIHdpdGggYSBsaXN0IG9mIGJhcmNvZGVzLCB0aGlzIGlzIHRoZSBmYXN0ZXN0IHdheSB0byBkbyBpdCAod2lsbCBuZWVkIFtyaXBncmVwXShodHRwczovL2dpdGh1Yi5jb20vQnVybnRTdXNoaS9yaXBncmVwKSkKCmBgYApzYW10b29scyB2aWV3IC1AIDUgcG9zc29ydGVkX2V4b21lX2JhbS5iYW0gfCByZyAtaiA1IC0tbm8tbGluZS1udW1iZXIgLUYgLWYgQlhfbGlzdC50eHQgPiBCQ19yZWFkcy5zYW0KYGBgCgoqKioKCiMgMTB4IEdlbm9taWNzIFNvZnR3YXJlCgpBbGwgMTB4IHNwZWNpZmljIHNvZnR3YXJlIGFuZCBpbmZvcm1hdGlvbiBhYm91dCAxMHggc3BlY2lmaWMgZmlsZSBmb3JtYXRzIGNhbiBiZSBmb3VuZCBbaGVyZV0oaHR0cHM6Ly9zdXBwb3J0LjEweGdlbm9taWNzLmNvbS9nZW5vbWUtZXhvbWUvc29mdHdhcmUvcGlwZWxpbmVzL2xhdGVzdC93aGF0LWlzLWxvbmctcmFuZ2VyKQoKCgoqKioKCgojIyBKdXBpdG9yIE5vdGVib29rCgpnZXQgaW50byB0aGUgTFIgZW52LgpgYGAKc291cmNlIC9vcHQvbG9uZ3Jhbmdlci0yLjIuMi9zb3VyY2VtZS5iYXNoCmBgYAoKCgoKCgoK